/*
 * memoire.h
 * projet Unix: 6 qui prend
 *
 *  @authors Doublier Sami
 *  @authors Pingot Alexandre
 */

#if !defined(_MEMOIRE_H_)
#define _MEMOIRE_H_
#include "include.h"
#include "semaphore.h"
#include <sys/shm.h>

/**
 * Structure de la mémoire partagée selon les règles du jeu
 * */
typedef struct sharedMem {
	int cartesSurLaTable[CARTES_LIGNE][CARTES_COLONNE];/* Tableau avec 4 lignes 5 colonnes avec en 0 la position de la dernière carte afin d'accéder plus rapidement */
	char nom[MAX_JOUEURS][LONG_NOM]; /* liste contenant les noms de tous les joueurs connecté */
	int visible[MAX_JOUEURS][MAX_CARTES_PAR_JOUEUR]; /* Tableau reprenant les cartes propre à chaques joueurs */
	int totaux_points [MAX_JOUEURS]; /* Changer totaux_points en points_totaux */
	int joueurs; /*nombre de joueurs connectés*/
} sharedMem;

typedef struct sharedCounter {
	int lecteurs; /*nombre de lecteurs qui lisent la mémoire partagée. */
} sharedCounter;

/**
 * Cette méthode permet de lire le contenu d'une mémoire et de recopier
 * celle-ci dans une autre entre le client/serveur.
 * @param sharedMem mémoire partagée entre client/serveur et inversément
 * @param sharedCounter compteur de nombre de process lecteurs
 * @param int identifiant du semaphore
 * */
extern void lecteur(sharedMem *, sharedMem *, sharedCounter*, int);

/**
 * Cette méthode permet d'écrire le contenu d'une mémoire dans une autre
 * entre le client/serveur.
 * Cette méthode ne sera utilisée que par le serveur.
 * @param sharedMem mémoire partagée
 * @param int identifiant du semaphore
 **/
extern void redacteur(sharedMem *, sharedMem *, int);

/**
 * Cette méthode va initialiser la mémoire partagée et retourne l'identifiant
 * de celle-ci.
 * @param key_t clé de la mémoire partagée
 * @param size_t size est la taille de la mémoire partagée
 **/
extern int shmInit( key_t, size_t size);

/**
 * Cette méthode attache une adresse memoire au segment de memoire partagee dont l'id
 * est passe en param et la renvoie
 * @param int identifiant de la mémoire partagée
 * @param char adresse à laquelle il faut attacher
 **/
extern char* shmAttach(int, char*);

/**
 * Affiche la mémoire lors de la lecture pour les tests du coté serveur
 * @param sharedMem mémoire partagée
 * */
extern void afficherMemoire(sharedMem *);

/**
 * Permet d'écrire le contenu du deuxième argument dans le premier
 * @param sharedMem mémoire partagée
 **/
extern void ecrireMemoire(sharedMem *, sharedMem *);

#endif
